package com.kotlin.android.app.ad

import com.google.gson.Gson
import com.kotlin.android.app.KEY_FLASH_AD
import com.kotlin.android.app.KEY_THEATERS_AD
import com.kotlin.android.app.adSPName
import com.kotlin.android.app.data.common.FlashAd
import com.kotlin.android.app.data.common.TheatersBoxAd
import com.kotlin.android.core.ext.getSpValue
import com.kotlin.android.core.ext.putSpValue
import com.kotlin.android.core.ext.removeKey
import com.kotlin.android.ktx.ext.log.e

/**
 * 广告管理器:
 * 1，闪屏广告；
 * 2，弹窗广告；
 *
 */
class ADManager private constructor() {
    companion object {
        val instance by lazy { ADManager() }
    }

    /**
     * 获取广告对象
     */
    fun <T> getAD(clazz: Class<T>): T? {
        val key = when (clazz) {
            FlashAd::class.java -> {
                KEY_FLASH_AD
            }
            TheatersBoxAd::class.java -> {
                KEY_THEATERS_AD
            }
            else -> {
                "getAD >>> 未匹配的广告 clazz=$clazz".e()
                return null
            }
        }
        return try {
            val json = getJson(key = key)
            if (json.isNotEmpty()) {
                Gson().fromJson(json, clazz)
            } else {
                null
            }
        } catch (e: Exception) {
            "getAD >>> clazz=$clazz".e()
            e.printStackTrace()
            null
        }
    }

    /**
     * 保持广告对象。
     * [any] 为null时，清空对象。
     */
    inline fun <reified T> saveAD(any: Any?) {
        val key = when(T::class.java) {
            FlashAd::class.java -> {
                KEY_FLASH_AD
            }
            TheatersBoxAd::class.java -> {
                KEY_THEATERS_AD
            }
            else -> {
                "saveAD >>> 未匹配的广告 any=$any".e()
                return
            }
        }
        try {
            if (any == null) {
                removeKey(key = key)
            } else {
                saveJson(key = key, json = "{\"objects\":${Gson().toJson(any)}}")
            }
        } catch (e: Exception) {
            "saveAD >>> key=$key, any=$any".e()
            e.printStackTrace()
        }
    }

    /**
     * 从sp中加载，可更换。
     */
    private fun getJson(key: String): String {
        return getSpValue(key = key, default = "", name = adSPName)
    }

    /**
     * 保持到sp中，可更换。
     */
    inline fun saveJson(key: String, json: String) {
        putSpValue(key = key, value = json, name = adSPName)
    }
}